<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>0043: Dialogs IX - Customizing (2 of 3) - Action Area | gtkDcoding</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="0043: Dialogs IX - Customizing (2 of 3) - Action Area" />
<meta name="author" content="Ron Tarrant" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="How to get the appropriate buttons into the Action Area of a custom GTK Dialog - a D-language tutorial." />
<meta property="og:description" content="How to get the appropriate buttons into the Action Area of a custom GTK Dialog - a D-language tutorial." />
<link rel="canonical" href="http://localhost:4000/posts/0043-custom-dialog-ii.html" />
<meta property="og:url" content="http://localhost:4000/posts/0043-custom-dialog-ii.html" />
<meta property="og:site_name" content="gtkDcoding" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2019-06-11T00:00:00-04:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="0043: Dialogs IX - Customizing (2 of 3) - Action Area" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"Ron Tarrant"},"dateModified":"2019-06-11T00:00:00-04:00","datePublished":"2019-06-11T00:00:00-04:00","description":"How to get the appropriate buttons into the Action Area of a custom GTK Dialog - a D-language tutorial.","headline":"0043: Dialogs IX - Customizing (2 of 3) - Action Area","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/posts/0043-custom-dialog-ii.html"},"url":"http://localhost:4000/posts/0043-custom-dialog-ii.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="../assets/main.css">
  <link rel="stylesheet" href="../css/style.css" /><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="gtkDcoding" /></head>
<body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="../">gtkDcoding</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="../about.html">About</a><a class="page-link" href="../index-reverse.html">Posts in Date Order</a><a class="page-link" href="../topics.html">Blog Posts by Topic</a></div>
      </nav></div>
</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper">
        <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
	<header class="post-header">
		<link rel="stylesheet" href="../css/font_size.css" />
		<link rel="stylesheet" href="../css/figure.css" />
		<link rel="stylesheet" href="../css/topics/dialog.css" />  <!-- sub in the tag/topic -->
		<link rel="stylesheet" href="../css/modal.css" />
		<link rel="stylesheet" href="../css/post.css" />
		<link rel="stylesheet" href="../css/mascot_effects.css" />

		
		
		<p class="post-meta">
		<time class="dt-published" datetime="2019-06-11T00:00:00-04:00" itemprop="datePublished">Tuesday, June 11, 2019
		</time>• by <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span class="p-author h-card" itemprop="name">Ron Tarrant</span></span></p>
	</header>

	<div class="post-content e-content" itemprop="articleBody">
		<div class="skew-line"></div>
		<h1 id="0043-dialogs-ix---customizing-2-of-3---action-area">0043: Dialogs IX - Customizing (2 of 3) - Action Area</h1>

<p>A reminder…</p>

<p>This collection of topics is split up like this:</p>

<ul>
  <li><em>Part I</em> (last time) deals with how to create an aesthetically-pleasing widget layout for a custom <code class="language-plaintext highlighter-rouge">Dialog</code>,</li>
  <li><em>Part II</em> (this one) covers user interaction, and</li>
  <li><em>Part III</em> (next time) brings it all together.</li>
</ul>

<p>Carrying on, we’ll talk about…</p>

<h2 id="the-action-area">The Action Area</h2>

<p>And as such, we’ll ignore everything else and just deal with buttons because that’s what the Action Area is all about. But before we get to examples, we need to look at…</p>

<h2 id="the-responsetype-flags">The ResponseType Flags</h2>

<p>There are two methods for creating and arming buttons for the Action Area and both methods use <code class="language-plaintext highlighter-rouge">ResponseType</code> flags. If you search <code class="language-plaintext highlighter-rouge">/generated/gtkd/gtk/c/types.d</code> for <code class="language-plaintext highlighter-rouge">ResponseType</code> you’ll find a list of all predefined <code class="language-plaintext highlighter-rouge">Button</code> responses that can be used in <code class="language-plaintext highlighter-rouge">Dialog</code> windows.</p>

<p>Where the afore-mentioned <code class="language-plaintext highlighter-rouge">Button</code> creation methods differ is in how the <code class="language-plaintext highlighter-rouge">Button</code>s are named. We either:</p>

<ul>
  <li>assemble an array of strings to use as button names, or</li>
  <li>build an array of stock IDs that provide predefined button names.</li>
</ul>

<h2 id="naming-action-area-buttons-by-hand">Naming Action Area Buttons by Hand</h2>

<div class="screenshot-frame">
	<div class="frame-header">
		Results of this example:
	</div>
	<div class="frame-screenshot">
		<figure>
			<img id="img0" src="../images/screenshots/013_dialogs/dialog_08.png" alt="Current example output" />		<!-- img# -->
			
			<!-- Modal for screenshot -->
			<div id="modal0" class="modal">																	<!-- modal# -->
				<span class="close0">&times;</span>															<!-- close# -->
				<img class="modal-content" id="img00" />															<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal0");														// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img0");															// img#
			var modalImg = document.getElementById("img00");													// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close0")[0];											// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>
			<figcaption>
			Current example output
			</figcaption>
		</figure>
	</div>

	<div class="frame-terminal">
		<figure class="right">
			<img id="img1" src="../images/screenshots/013_dialogs/dialog_08_term.png" alt="Current example terminal output" />		<!-- img#, filename -->

			<!-- Modal for terminal shot -->
			<div id="modal1" class="modal">																				<!-- modal# -->
				<span class="close1">&times;</span>																		<!-- close# -->
				<img class="modal-content" id="img11" />																		<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal1");																	// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img1");																		// img#
			var modalImg = document.getElementById("img11");																// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close1")[0];														// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>

			<figcaption>
				Current example terminal output (click for enlarged view)
			</figcaption>
		</figure>
	</div>

	<div class="frame-footer">																								<!-- ------------- filename (below) --------- -->
		The code file for this example is available <a href="https://github.com/rontarrant/gtkd_demos/blob/master/013_dialogs/dialog_08_custom_action_area_button_text.d" target="_blank">here</a>.
	</div>
</div>

<p>In this example, we’re supplying our own button names.</p>

<p>Here’s the first chunk of the <code class="language-plaintext highlighter-rouge">ScratchDialog</code> class:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="n">ScratchDialog</span> <span class="p">:</span> <span class="n">Dialog</span>
<span class="p">{</span>
	<span class="k">private</span><span class="p">:</span>
	<span class="n">DialogFlags</span> <span class="n">flags</span> <span class="p">=</span> <span class="n">DialogFlags</span><span class="p">.</span><span class="n">MODAL</span><span class="p">;</span>
	<span class="n">ResponseType</span><span class="p">[]</span> <span class="n">responseTypes</span> <span class="p">=</span> <span class="p">[</span><span class="n">ResponseType</span><span class="p">.</span><span class="n">YES</span><span class="p">,</span> <span class="n">ResponseType</span><span class="p">.</span><span class="n">NO</span><span class="p">,</span> <span class="n">ResponseType</span><span class="p">.</span><span class="n">ACCEPT</span><span class="p">];</span>
	
	<span class="nb">string</span><span class="p">[]</span> <span class="n">buttonLabels</span> <span class="p">=</span> <span class="p">[</span><span class="s">"Yes"</span><span class="p">,</span> <span class="s">"No"</span><span class="p">,</span> <span class="s">"In the Barrel"</span><span class="p">];</span>
	<span class="nb">string</span> <span class="n">titleText</span> <span class="p">=</span> <span class="s">"Do you know where the monkey is?"</span><span class="p">;</span>
</code></pre></div></div>

<p>We’ve used the <code class="language-plaintext highlighter-rouge">DialogFlag</code>s type in every <code class="language-plaintext highlighter-rouge">Dialog</code> example we’ve done to date and it’s mostly useful to make the <code class="language-plaintext highlighter-rouge">Dialog</code> stay in front of its parent window (that modal stuff) so let’s take a quick look at…</p>

<p>The constructor:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span><span class="p">:</span>
<span class="k">this</span><span class="p">(</span><span class="n">Window</span> <span class="n">_parentWindow</span><span class="p">)</span>
<span class="p">{</span>
	<span class="k">super</span><span class="p">(</span><span class="n">titleText</span><span class="p">,</span> <span class="n">_parentWindow</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">buttonLabels</span><span class="p">,</span> <span class="n">responseTypes</span><span class="p">);</span>
	<span class="n">addOnResponse</span><span class="p">(&amp;</span><span class="n">doSomething</span><span class="p">);</span>
	<span class="n">run</span><span class="p">();</span>
	<span class="n">destroy</span><span class="p">();</span>
	
<span class="p">}</span> <span class="c1">// this()</span>
</code></pre></div></div>

<p>Again, it’s pretty much what we’ve used before. So where does this example differ? Right here in the callback function:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code>	<span class="k">private</span><span class="p">:</span>
	<span class="kt">void</span> <span class="n">doSomething</span><span class="p">(</span><span class="kt">int</span> <span class="n">response</span><span class="p">,</span> <span class="n">Dialog</span> <span class="n">d</span><span class="p">)</span>
	<span class="p">{</span>
		<span class="k">switch</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
		<span class="p">{</span>
			<span class="k">case</span> <span class="n">ResponseType</span><span class="p">.</span><span class="n">YES</span><span class="p">:</span>
				<span class="n">writeln</span><span class="p">(</span><span class="s">"So, you know where the monkey is."</span><span class="p">);</span>
			<span class="k">break</span><span class="p">;</span>
			
			<span class="k">case</span> <span class="n">ResponseType</span><span class="p">.</span><span class="n">NO</span><span class="p">:</span>
				<span class="n">writeln</span><span class="p">(</span><span class="s">"You don't know where the monkey is."</span><span class="p">);</span>
			<span class="k">break</span><span class="p">;</span>
			
			<span class="k">case</span> <span class="n">ResponseType</span><span class="p">.</span><span class="n">ACCEPT</span><span class="p">:</span>
				<span class="n">writeln</span><span class="p">(</span><span class="s">"That's a bit on the nose, a monkey in a barrel."</span><span class="p">);</span>
			<span class="k">break</span><span class="p">;</span>
			
			<span class="k">default</span><span class="p">:</span>
				<span class="n">writeln</span><span class="p">(</span><span class="s">"Dialog closed."</span><span class="p">);</span>
			<span class="k">break</span><span class="p">;</span>
		<span class="p">}</span>
		
	<span class="p">}</span> <span class="c1">// doSomething()</span>
	
<span class="p">}</span> <span class="c1">// class ScratchDialog</span>
</code></pre></div></div>

<p>Like in other <code class="language-plaintext highlighter-rouge">Dialog</code> examples, we test the response and look for a match. The difference is we have more options and so a switch/case statement is substituted for if/else.</p>

<p>Okay, perhaps that didn’t turn out to be as exciting as it might have been, so let’s just move right along…</p>

<h2 id="using-stockids-to-get-predefined-buttons">Using StockIDs to get Predefined Buttons</h2>

<div class="screenshot-frame">
	<div class="frame-header">
		Results of this example:
	</div>
	<div class="frame-screenshot">
		<figure>
			<img id="img2" src="../images/screenshots/013_dialogs/dialog_09.png" alt="Current example output" />		<!-- img# -->
			
			<!-- Modal for screenshot -->
			<div id="modal2" class="modal">																<!-- modal# -->
				<span class="close2">&times;</span>														<!-- close# -->
				<img class="modal-content" id="img22" />														<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal2");													// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img2");														// img#
			var modalImg = document.getElementById("img22");												// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close2")[0];										// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>
			<figcaption>
			Current example output
			</figcaption>
		</figure>
	</div>

	<div class="frame-terminal">
		<figure class="right">
			<img id="img3" src="../images/screenshots/013_dialogs/dialog_09_term.png" alt="Current example terminal output" /> 		<!-- img#, filename -->

			<!-- Modal for terminal shot -->
			<div id="modal3" class="modal">																			<!-- modal# -->
				<span class="close3">&times;</span>																	<!-- close# -->
				<img class="modal-content" id="img33" />																	<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal3");																// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img3");																	// img#
			var modalImg = document.getElementById("img33");															// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close3")[0];													// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>

			<figcaption>
				Current example terminal output (click for enlarged view)
			</figcaption>
		</figure>
	</div>

	<div class="frame-footer">																							<!--------- filename (below) ------------>
		The code file for this example is available <a href="https://github.com/rontarrant/gtkd_demos/blob/master/013_dialogs/dialog_09_custom_action_area_stockid.d" target="_blank">here</a>.
	</div>
</div>

<p>In this example using <code class="language-plaintext highlighter-rouge">StockID</code>s, you might think because we’re not naming buttons, it’s less work, but it’s about the same:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="n">StockButtonDialog</span> <span class="p">:</span> <span class="n">Dialog</span>
<span class="p">{</span>
	<span class="n">GtkDialogFlags</span> <span class="n">flags</span> <span class="p">=</span> <span class="n">GtkDialogFlags</span><span class="p">.</span><span class="n">MODAL</span><span class="p">;</span>
	<span class="n">MessageType</span> <span class="n">messageType</span> <span class="p">=</span> <span class="n">MessageType</span><span class="p">.</span><span class="n">INFO</span><span class="p">;</span>
	<span class="n">StockID</span><span class="p">[]</span> <span class="n">stockIDs</span> <span class="p">=</span> <span class="p">[</span><span class="n">StockID</span><span class="p">.</span><span class="n">CONNECT</span><span class="p">,</span> <span class="n">StockID</span><span class="p">.</span><span class="n">DISCONNECT</span><span class="p">];</span>
	<span class="n">ResponseType</span><span class="p">[]</span> <span class="n">responseTypes</span> <span class="p">=</span> <span class="p">[</span><span class="n">ResponseType</span><span class="p">.</span><span class="n">YES</span><span class="p">,</span> <span class="n">ResponseType</span><span class="p">.</span><span class="n">NO</span><span class="p">];</span>
	<span class="nb">string</span> <span class="n">titleText</span> <span class="p">=</span> <span class="s">"Connect or disconnect?"</span><span class="p">;</span>
</code></pre></div></div>

<p>Again, you can look in <code class="language-plaintext highlighter-rouge">/generated/gtkd/gtk/c/types.d</code> for the full list of <code class="language-plaintext highlighter-rouge">StockID</code>s and there are tons of them. <em>But!</em> A lot of them are deprecated, so to lessen the burden of weeding out the ones that aren’t, I copied the still-current ones into <a href="https://github.com/rontarrant/gtkd_demos/blob/master/downloads/StockID_precated.d">another file that you can download if you wish</a>.</p>

<p>Once you’ve picked out your button names, as before, just instantiate an array and you’re set.</p>

<h3 id="the-constructor">The Constructor</h3>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">this</span><span class="p">(</span><span class="n">Window</span> <span class="n">_parentWindow</span><span class="p">)</span>
<span class="p">{</span>
	<span class="k">super</span><span class="p">(</span><span class="n">titleText</span><span class="p">,</span> <span class="n">_parentWindow</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">stockIDs</span><span class="p">,</span> <span class="n">responseTypes</span><span class="p">);</span>
	<span class="n">addOnResponse</span><span class="p">(&amp;</span><span class="n">doSomething</span><span class="p">);</span>
	<span class="n">run</span><span class="p">();</span>
	<span class="n">destroy</span><span class="p">();</span>
	
<span class="p">}</span> <span class="c1">// this()</span>
</code></pre></div></div>

<p>The only significant difference in the constructor is that we pass in an array of <code class="language-plaintext highlighter-rouge">StockID</code> types instead of <code class="language-plaintext highlighter-rouge">buttonLabel</code> names.</p>

<p>The callback is the same in principle, so I’ll leave you to view it at your leisure.</p>

<h2 id="conclusion">Conclusion</h2>

<p>One more thing of note…</p>

<p>If you have some very specialized actions in mind for your custom <code class="language-plaintext highlighter-rouge">Dialog</code>, you may be better off to go with the first method of naming <code class="language-plaintext highlighter-rouge">Button</code>s using a string array. The <code class="language-plaintext highlighter-rouge">ResponseType</code> names may not match up to these specialized actions, but you can cover that up with how you name the <code class="language-plaintext highlighter-rouge">Button</code>s. No one ever has to know that the <code class="language-plaintext highlighter-rouge">ResponseType.CONVERT</code> flag used with a <code class="language-plaintext highlighter-rouge">Button</code> named <em>Flying Rat</em> triggers a function called <code class="language-plaintext highlighter-rouge">goFetchAnotherPigeonPhoto()</code>.</p>

<p>So, that’s the <code class="language-plaintext highlighter-rouge">Dialog</code>’s action area. Next time we finish up this mini-series as we dig into the Content Area and bring everything together.</p>

<div class="blog-nav">
	<div style="float: left;">
		<a href="./0042-custom-dialog-i.html">Previous: Dialog Aesthetics</a>
	</div>
	<div style="float: right;">
		<a href="./0044-custom-dialog-iii.html">Next: A Fancy Dialog</a>
	</div>
</div>
<p>
	<h3></h3>
<div class="inpage-frame">
	<a href="https://github.com/sponsors/rontarrant">
		<BR>
		<BR>
		<B>Is this article useful? Educational? Entertaining, perhaps?</B>
		<BR>
		<figure class="left">
			<img src="../images/favorite_32.png" alt="Sponsorship heart" style="width: 32px; height: 32px;">
		</figure>
		You're free to accept or decline this invitation to become our newest sponsor.
	</a>
</div>
	<h4 class="comment-blurb"><B>Comments? Questions? Observations?</B></h4>
	<p>
		Did we miss a tidbit of information that would make this post even more informative? Let's talk about it in the comments.
	</p>
	<script src="https://utteranc.es/client.js"
		repo="rontarrant"
		issue-term="pathname"
		theme="github-light"
		crossorigin="anonymous"
		async>
	</script>
	<ul>
		<li> come on over to the <a href="https://forum.dlang.org/">D Language Forum</a> and look for one of the <i>gtkDcoding</i> announcement posts, </li>
		<li> drop by <a href="https://forum.gtkd.org/">the <i>GtkD Forum</i></a>,</li>
		<li> follow the link below to email me, or</li>
		<li> go to the	<a href="https://www.facebook.com">gtkDcoding Facebook page.</a></li>
	</ul>
</p>
<p> You can also subscribe <a href="/feed.xml">via RSS</a> so you won't miss anything. Thank you very much for dropping by.</p>
<p>&copy; Copyright 2025 Ron Tarrant </p>
</div>

	<a class="u-url" href="./0043-custom-dialog-ii.html" hidden></a>
</article>

      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">gtkDcoding</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col footer-col-1">
        <ul class="contact-list">
          <li class="p-name">Ron Tarrant</li><li><a class="u-email" href="mailto:gtkDcoding@gmail.com">gtkDcoding@gmail.com</a></li></ul>
      </div>

      <div class="footer-col footer-col-2"><ul class="social-media-list"><li><a href="https://github.com/rontarrant"><svg class="svg-icon"><use xlink:href="../assets/minima-social-icons.svg#github"></use></svg> <span class="username">rontarrant</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>Simple examples of how to use GtkD to build GUI applications.</p>
      </div>
    </div>

  </div>

</footer>
</body>

</html>
